#/usr/bin/python
#-*-<coding=UTF-8>-*-

"""
本例展示了wxPython的事件处理过程
"""

import wx

class Frame(wx.Frame):
    
    def __init__(self):
	wx.Frame.__init__(self,parent=None,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize)
	self.panel = wx.Panel(self)
	self.button = wx.Button(self.panel,label="Not Over",pos=(100,15))
	#创建<框架>绑定，将EVT_BUTTON事件与OnButtonClick()事件处理函数绑定起来.
	#事件源为button控件; 这个好理解
	self.Bind(wx.EVT_BUTTON,self.OnButtonClick,self.button)
	"""
	这里要讲的是，对于EVT_BUTTON首先会在button中查找事件处理器，
	如果没有，则会在其父容器中查找，即在panel中查找，如果还没有，则会一直沿着顺序找到有父容器处理为止;
	在此例中，panel中也没有相应的事件处理器，那最后找到self.Bind()中找到，此时self是指向顶级框架Frame的.
	所以，如果我们在button中绑定事件处理器，效果也是一样的.
	如果是这样的话,为什么还要在Frame中绑定呢? 有什么好处吗?
	"""
	#不过看起来<按钮>绑定，执行效果也是一样的.
	self.button.Bind(wx.EVT_BUTTON,self.OnButtonClick,self.button)
	
	#创建<按钮>绑定,将EVT_ENTER_WINDOW与OnEnterWindow/OnLeaveWindow绑定起来.
	self.button.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow)
	self.button.Bind(wx.EVT_LEAVE_WINDOW,self.OnLeaveWindow)

    def OnButtonClick(self,event):
	self.panel.SetBackgroundColour("Green")
	self.panel.Refresh()

    def OnEnterWindow(self,event):
	self.button.SetLabel("Over Me!")
	event.Skip()

    def OnLeaveWindow(self,event):
	self.button.SetLabel("Not Over")
	

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()
